"""
增加数据
    主要需要三步操作:
        1.创建模型对象
            模型对象 = 模型类(字段名=字段值)
        2.将模型对象添加到会话中
            组件对象.session.add(模型对象)
        3.提交会话
            组件对象.session.commit()


    注意点:
        给模型对象设置数据 可以通过 初始化参数 或者 赋值属性 两种方式
        session.add(模型对象) 添加单条数据到会话中, session.add_all(列表) 添加多条数据到会话中
        这里的 会话 并不是 状态保持机制中的 session，而是 sqlalchemy 的会话。它被设计为 数据操作的执行者, 从SQL角度则可以理解为是一个 加强版的数据库事务
        sqlalchemy 会 自动创建事务, 并将数据操作包含在事务中, 提交会话时就会提交事务
        事务提交失败会自动回滚
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 相关配置
# 设置数据库连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@127.0.0.1:3306/Test"
# # 是否追踪数据库修改(开启后会触发一些钩子函数)  一般不开启, 会影响性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 是否显示底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = True

# 初始化组件对象, 直接关联Flask应用
db = SQLAlchemy(app)


# 构建模型类  类->表  类属性->字段  实例对象->记录
class User(db.Model):
    """
    注意点:
        模型类必须继承 db.Model, 其中 db 指对应的组件对象
        表名默认为类名小写, 可以通过 __tablename__类属性 进行修改
        类属性对应字段, 必须是通过 db.Column() 创建的对象
        可以通过 create_all() 和 drop_all()方法 来创建和删除所有模型类对应的表
    """
    # 设置表名, 表名默认为类名小写
    __tablename__ = 't_user'
    id = db.Column(db.Integer, primary_key=True)  # 设置主键, 默认自增
    name = db.Column('username', db.String(20), unique=True)  # 设置字段名 和 唯一约束
    age = db.Column(db.Integer, default=10, index=True)  # 设置默认值约束 和 索引


@app.route('/')
def index():
    """增加数据"""

    # 1.创建模型对象
    user1 = User(name='zs', age=20)
    # user1 = User()
    # user1.name = 'zm'
    # user1.age = 22

    # 2.将模型对象添加到会话中
    db.session.add(user1)
    # 添加多条记录
    # db.session.add_all([user1, user2, user3])

    # 3.提交会话(提交事务)
    # sqlalchemy会自动创建隐式事务
    # 事务失败会自动回滚
    db.session.commit()

    return "index"


if __name__ == '__main__':
    # 删除所有继承自db.Model的表
    db.drop_all()
    # 创建所有继承自db.Model的表
    db.create_all()
    app.run(debug=True)
